package com.bytz.modules.cms.domain.manager;

import cn.hutool.core.util.StrUtil;
import com.bytz.modules.cms.domain.ProductPriceComputer;
import com.bytz.modules.cms.domain.model.price.PriceComputeContext;
import com.bytz.modules.cms.domain.model.price.PriceComputeResult;
import com.bytz.modules.cms.product.entity.Product;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * 价格管理器
 * @author shanxuezhong
 */
public class ProductPriceManager {
    /**
     * 校验器
     */
    private final List<ProductPriceComputer> computers = new LinkedList<>();

    /**
     * 添加价格计算器
     * @param priceComputer 价格计算器
     */
    public void addPriceComputer(ProductPriceComputer priceComputer) {
        computers.add(priceComputer);
    }

    /**
     * 进行计算
     */
    public Map<String, PriceComputeResult> compute(String resellerId, List<Product> products) {
        if (products == null || StrUtil.isBlank(resellerId)) {
            return null;
        }

        // 初始化Context
        PriceComputeContext context = new PriceComputeContext(products,resellerId);


        for (ProductPriceComputer computer : computers) {
            // 执行计算
            computer.doCompute(context);
            // 计算后处理
            computer.afterCompute(context);

            // 如果没必要继续下去
            if (!context.getNeedContinue()) {
                break;
            }
        }
        return context.getResults();
    }

}